/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package digitrencer;

import java.io.*;

/**
 * A main függvényt tartalmazó osztály.
 * @author taplonaplo
 */
public class Main {

    /**
     * A program belépési pontja. Ez a függvény futtatja az egyes teszteseteket.
     * @param args A program parancssoron kapott paraméterei, nem használjuk.
     */
    public static void main(String[] args) {
        String userinput;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int testnumber = 0;

        System.out.println("Teszteset valasztasa:\n"
                         + "1. Kapcsolo es LED tesztje\n"
                         + "2. Jelgenerator, inverter es LED tesztje\n"
                         + "3. Instabil visszacsatolt halozat\n"
                         + "4. Halozat alaphelyzetbe allitasa\n"
                         + "5. Stabil visszacsatolt halozat\n");
        
        try {
            userinput = reader.readLine();
            testnumber = Integer.parseInt(userinput);
            switch(testnumber){
                case 1:{
                    System.out.println("1. Kapcsolo es LED tesztje\n");
                    //Hálózat betöltése
                    Model model = new Model(1);
                    Wire[] w1 = {new Wire(1)};
                    model.addWire(w1[0]);
                    Switch s1 = new Switch(2, null, w1);
                    model.addElement(s1);
                    Led l1 = new Led(3, w1, null);
                    model.addElement(l1);

                    //Kapcsoló állítása
                    model.setSwitch(s1);

                    //Hálózat frissítése
                    model.refresh();

                    //LED leolvasása
                    boolean val = model.getOutputValue(l1);
                   
                    break;}
                case 2:{
                    System.out.println("2. Jelgenerator, inverter es LED tesztje\n");
                    //Hálózat betöltése
                    Model model = new Model(2);
                    Wire[] w1 = {new Wire(1)};
                    model.addWire(w1[0]);
                    Wire[] w2 = {new Wire(2)};
                    model.addWire(w2[0]);
                    Generator gen1 = new Generator(3, null, w1);
                    model.generator = gen1;
                    model.addElement(gen1);
                    Inverter inv1 = new Inverter(4, w1, w2);
                    model.addElement(inv1);
                    Led l1 = new Led(5, w2, null);
                    model.addElement(l1);

                    //Generátor szekvenciájának beállítása
                    String seq1 = "0110";
                    model.setSequence(gen1,seq1);

                    //Generátor léptetése
                    model.stepGenerators();

                    //Hálózat frissítése
                    model.refresh();

                    //Generátor szekvenciájának leolvasása
                    String seq2 = model.getSequence(gen1);

                    //Generátor értékének lekérdezése
                    boolean val = model.getInputValue(gen1);

                    break;}
                case 3:{
                    System.out.println("3. Instabil visszacsatolt halozat\n");
                    //Hálózat betöltése
                    Model model = new Model(3);
                    Wire[] w1 = {new Wire(1)};
                    model.addWire(w1[0]);
                    Inverter inv1 = new Inverter(2, w1, w1);
                    model.addElement(inv1);
                    Led l1 = new Led(3, w1, null);
                    model.addElement(l1);

                    //Hálózat frissítése
                    model.refresh();

                    System.out.println("EXCEPTION | \"Instabil halozat\"");

                    break;}
                case 4:{
                    System.out.println("4. Halozat alaphelyzetbe allitasa\n");
                    //Hálózat betöltése
                    Model model = new Model(4);
                    Wire[] w1 = {new Wire(1)};
                    model.addWire(w1[0]);
                    Wire[] w2 = {new Wire(2)};
                    model.addWire(w2[0]);
                    Wire[] w3 = {new Wire(3)};
                    model.addWire(w3[0]);
                    Wire[] gateinput = {w1[0],w2[0]};
                    Generator gen1 = new Generator(4, null, w1);
                    model.generator = gen1;
                    model.addElement(gen1);
                    Switch s1 = new Switch(5, null, w2);
                    model.addElement(s1);
                    And_gate and1 = new And_gate(6, gateinput, w3);
                    model.addElement(and1);
                    Led l1 = new Led(7, w3, null);
                    model.addElement(l1);

                    //Kapcsoló állítása
                    model.setSwitch(s1);

                    //Generátor szekvenciájának beállítása
                    String seq1 = "1100";
                    model.setSequence(gen1,seq1);

                    //Generátor léptetése
                    model.stepGenerators();

                    //Hálózat frissítése
                    model.refresh();

                    //LED leolvasása
                    boolean val = model.getOutputValue(l1);

                    //Rendszer megállítása
                    model.reset();

                    break;}
                case 5:{
                    System.out.println("5. Stabil visszacsatolt halozat\n");
                    //Hálózat betöltése
                    Model model = new Model(5);
                    Wire[] w1 = {new Wire(1)};
                    model.addWire(w1[0]);
                    Wire[] w2 = {new Wire(2)};
                    model.addWire(w2[0]);
                    Switch s1 = new Switch(3, null, w1);
                    model.addElement(s1);
                    Wire[] gateinput = {w1[0],w2[0]};
                    Or_gate or1 = new Or_gate(4, gateinput, w2);
                    model.addElement(or1);
                    Led l1 = new Led(5, w2, null);
                    model.addElement(l1);

                    //Kapcsoló állítása
                    model.setSwitch(s1);

                    //Hálózat frissítése
                    model.refresh();

                    //LED leolvasása
                    boolean val = model.getOutputValue(l1);

                    break;}
                default:{break;}
            }
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}
